'''
Created on 26/06/2010

@author: kivson
'''
from leitor import Leitor

class Exec(object):
    '''
    maquina de execucao Mepa
    '''


    def __init__(self, cod):
        '''
        Constructor
        '''
        self.terminou = 0
        self.leitor = Leitor(cod)
        self.pilha = []
        self.basesDaPilha = [0]
    def executa(self):
        while (not self.terminou):
            self.trata(self.leitor.proximo())
    
    
    
    def trata(self, cmd):
        if cmd == "INPP":
            pass
        elif cmd.split()[0] == "AMEN":
            for i in xrange(int(cmd.split()[1])):
                self.pilha.append(0)
        elif cmd.split()[0] == "DSVS":
            self.leitor.proximo(label=cmd.split()[1])
        elif cmd.split()[0] == "IPVL":
            self.basesDaPilha[-1] -= int(cmd.split()[1])
        elif cmd.split()[0] == "LEIT":
            print ">>"
            self.pilha.append(eval(raw_input()))
        elif cmd.split()[0] == "IMPR":
            print self.pilha.pop()
        elif cmd.split()[0] == "ARMZ":
            if len (cmd.split()) > 2:
                self.pilha[int(cmd.split()[1])] = self.pilha.pop()
            else:
                self.pilha[self.basesDaPilha[-1] + int(cmd.split()[1])] = self.pilha.pop()
        elif cmd.split()[0] == "CRVL":
            if len (cmd.split()) > 2:
                self.pilha.append(self.pilha[int(cmd.split()[1])])
            else:
                self.pilha.append(self.pilha[self.basesDaPilha[-1] + int(cmd.split()[1])])
        elif cmd.split()[0] == "CRCT":
            self.pilha.append(eval(cmd.split()[1]))
        elif cmd.split()[0] == "NEGA":
            self.pilha[-1] = -self.pilha[-1] 
        elif cmd.split()[0] == "SOMA":
            n1 = self.pilha.pop()
            n2 = self.pilha.pop()
            self.pilha.append(n2 + n1)
        elif cmd.split()[0] == "MULT":
            n1 = self.pilha.pop()
            n2 = self.pilha.pop()
            self.pilha.append(n2 * n1)
        elif cmd.split()[0] == "DIVI":
            n1 = self.pilha.pop()
            n2 = self.pilha.pop()
            self.pilha.append(n2 / n1)
        elif cmd.split()[0] == "SUBT":
            n1 = self.pilha.pop()
            n2 = self.pilha.pop()
            self.pilha.append(n2 - n1)
        elif cmd.split()[0] == "CMIG":
            if (self.pilha.pop() == self.pilha.pop()):
                self.pilha.append(True)
            else:
                self.pilha.append(False)
        elif cmd.split()[0] == "CMME":
            if (self.pilha.pop() > self.pilha.pop()):
                self.pilha.append(True)
            else:
                self.pilha.append(False)
        elif cmd.split()[0] == "CMDG":
            if (self.pilha.pop() != self.pilha.pop()):
                self.pilha.append(True)
            else:
                self.pilha.append(False)
        elif cmd.split()[0] == "CMMA":
            if (self.pilha.pop() < self.pilha.pop()):
                self.pilha.append(True)
            else:
                self.pilha.append(False)
        elif cmd.split()[0] == "CMEG":
            if (self.pilha.pop() >= self.pilha.pop()):
                self.pilha.append(True)
            else:
                self.pilha.append(False)
        elif cmd.split()[0] == "CMAG":
            if (self.pilha.pop() <= self.pilha.pop()):
                self.pilha.append(True)
            else:
                self.pilha.append(False)
        elif cmd.split()[0] == "DSVF":
            if not self.pilha.pop():
                self.leitor.proximo(label=cmd.split()[1])
        elif cmd.split()[0] == "PARA":
            self.terminou = True
            
            
        elif cmd.split()[0] == "CHPR":
            self.basesDaPilha.append(len(self.pilha))
            self.leitor.salvaLinha()
            self.leitor.proximo(label=cmd.split()[1])
            
            
        elif cmd.split()[0] == "RTPR":
            self.pilha = self.pilha[:self.basesDaPilha.pop()]
            self.leitor.retornaLinha()
        else:
            pass


if __name__ == "__main__":
    
#    f = file("../mepa")
#    linhas = f.read()
#    
#    e = Exec(linhas)
#    
#    e.executa()
    import Base
    import ALex.AnalisadorLexico
    from ASint.ASintatico import AnaSintatico
    
    tabelaF = file ('../Tabela.txt')
    tabelaStr = tabelaF.read()
    tabela = Base.TSR.TabelaRS();
    tabela.carregaTabelaString(tabelaStr)
    f = file('../lalg')
    s = f.read()
    LEX = ALex.AnalisadorLexico.AnaLex(tabela, s)
    LEX.analisa()
    SIN = AnaSintatico(LEX.tabelaSimbolos)
    #print LEX.getListTokens()
    SIN.analisa(LEX.getListTokens())
#    for c,i in SIN.tabelaSimbolos.tokens.iteritems():
#        if i == None: continue
#        if i['classe']!= 'operador' and i['classe']!= 'palavra_resservada':
#            print c, i
    e = Exec(SIN.mepaCode)
    e.executa()
        
